package com.tedu.day02.oop;

/**
 *   特点：
 *       类：成员变量/成员方法/构造方法
 *    抽象类：成员变量/成员方法/构造方法
 *     创建抽象类--普通类变成（实现）子类--继承抽象类
 *    成员变量：既可以有变量，也可以有常量
 *    构造方法：有，用于子类调用抽象【父】类的成员变量--赋值
 *    成员方法：既可以抽象，或非抽象
 *    抽象方法与非抽象方法出现在抽象类问题：
 *     A：抽象方法  【重写】强制要求子类完成父类抽象方法
 *     B：非抽象方法 【拓展】子类继承的事情，提高代码复用性
 */
abstract class Foo{
    //成员变量
    public int i=10;
    public int J=20;  //成员变量：常量
    //java强类型语言：大小写分明
    //public int j=30;
    public Foo() {
        this(30);  //

    }
    public Foo(int i) {
        this.i = i;
    }
    //成员方法：抽象方法
    public abstract void show();
    //成员方法：非抽象方法
    public void method(){
        System.out.println("Foo method");
    }


}

//实现{子}类
class Goo extends Foo{
    public void show() {
        System.out.println("Goo show");
    }
    public void method(){
        System.out.println("Goo method");
    }
}

public class 抽象类补充知识点 {
    public static void main(String[] args) {
        //抽象类--继承--多态性--向上造型
        Foo f=new Goo();
        //①实例化---子类的构造器，默认存在无参构造器
        //在通过super（）调用父类无参构造器
        //②执行抽象类无参构造器，发现有this（参数）调用本类其他有参构造器
        //③this调用的同时，完成对抽象
        System.out.println(f.i);
    }
}

 /* 拓展：abstract关键存在问题*/
abstract class Aoo{
    //private abstract void show1; 冲突
    //public final abstract void show2; 冲突
    //public static abstract void show3();
    //无意义：静态方法需要加语句块{}，抽象方法

 }
